import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'
Vue.use(VueAxios, axios)
//导入token工具包
import { getToken, saveToken } from './token.js'
//导入toast
import { Toast } from 'vant'
//导入路由
import router from '@/router/index.js'
//导入json-bigint解决大数精度丢失问题
import JSONbig  from 'json-bigint'

//2.创建instance实例
const instance = axios.create({
  baseURL: 'http://toutiao-app.itheima.net',
  timeout: 10000,
  // `transformResponse` 在传递给 then/catch 前，允许修改响应数据
  //使用自定义解析方式来代替默认的json解析
  transformResponse: [function (data) {
    try{
      return JSONbig.parse(data)
    }catch(err){
      /* 如果无法解析json，就返回默认data */
      return data
    }
  }],
})

/* 添加请求拦截器： 给每一个接口添加token */
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    if (getToken()) {
      //如果有token，就默认在请求头添加token
      config.headers = { Authorization: `Bearer ${getToken().token}` }
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

/* 添加响应拦截器解决401token问题 */
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    return response
  },
  async function (error) {
    // 对响应错误做点什么
    //0.判断错误码是不是401
    if (error.response && error.response.status == 401) {
      /* 拦截401成功之后，控制台也会打印一次401错误信息。如果爆红看着不舒服，可以手动清空控制台 */
    
      
      //1.判断用户有没有token
      if (getToken()) {
        //1.1 有token,说明token过期 : 使用refresh_token刷新token
        /* 细节：刷新token接口不能使用instance来发送，而应该使用axios
            (1)刷新token接口，不需要token，而需要refresh_token
            (2)instance会自动的在请求拦截中添加token,但是执行到这里已经说明token是过期了
            */
        try {
          //1.1.1 刷新成功： 替换token
          let res = await axios({
            url: 'http://toutiao-app.itheima.net/v1_0/authorizations',
            method: 'put',
            headers: { Authorization: `Bearer ${getToken().refresh_token}` }
          })

          console.log(res)
          //刷新token
          saveToken({
            refresh_token: getToken().refresh_token,
            token: res.data.data.token
          })
          //刷新成功之后，让浏览器继续发送用户之前的请求
          return instance(error.config)
        } catch (err) {
          //1.1.2 刷新失败：说明refresh_token 也过期
          //处理方式重新登录
          Toast.fail('请先登录')
          router.push({ path: '/login' })
        }
      } else {
        //1.2 没有token，说明没有登录。 跳转登录页
        Toast.fail('请先登录')
        router.push({ path: '/login' })
      }
    } else {
      //不是401，与token无关，不做处理
    }

    //不是401，正常抛出异常错误
    return Promise.reject(error)
  }
)

export default instance